/**
 * @description 基于类对象的    同步语句块    进行线程同步的例程
 * 程序说明：
 * 两个线程公式操作m_data1000*1000次，利用同步语句块，为操作过程加锁。
 * @pageNo 417
 * @author mlmoria
 * @date 2017年2月8日
 * 
 */
package No11Thread;

public class J_BlockClass extends Thread{
	
	public int m_ID;
	public static int m_data=0;
	public static int m_times=1000;
	public boolean m_done;

	public J_BlockClass(int id){
		m_ID=id;
	}
	
	@Override
	public void run() {
	
		m_done=false;
		int d=((m_ID%2==0)?1:-1);
		System.out.println("运行线程："+m_ID+"(增量为："+d+")");
		try {
			synchronized(Class.forName("No11Thread.J_BlockClass")){ //这个是用来控制同步的实例对象，换成字符串也是一样的
				System.out.println("线程："+m_ID+"进入同步语句块，m_data="+m_data);
				for(int i=0;i<m_times;i++)
					for(int j=0;j<m_times;j++)
						m_data+=d;
				System.out.println("线程："+m_ID+"离开同步语句块，m_data="+m_data);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		m_done=true;
		System.out.println("结束线程："+m_ID);
	}
	
	public static void main(String[] args) {
		J_BlockClass t1=new J_BlockClass(1);
		J_BlockClass t2=new J_BlockClass(2);
		t1.m_done=false;
		t2.m_done=false;
		t1.start();
		t2.start();
		//m_done是用来监测两个线程是否运行结束的。
		while(!t1.m_done||!t2.m_done);
		System.out.println("结果：m_data="+m_data);
	}
}
